class: center, middle, inverse, title-slide .title[ # Introduction to Geospatial Techniques for Social Scientists in R ] .subtitle[ ## Mapping ] .author[ ### Stefan Jünger & Anne-Kathrin Stroppe ] .institute[ ###
GESIS Workshop
] .date[ ### June 06, 2022 ] --- layout: true --- ## Now <table class="table" style="margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:left;"> Day </th> <th style="text-align:left;"> Time </th> <th style="text-align:left;"> Title </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;color: gray !important;"> June 06 </td> <td style="text-align:left;color: gray !important;"> 10:00-11:30 </td> <td style="text-align:left;font-weight: bold;"> Introduction to GIS </td> </tr> <tr> <td style="text-align:left;color: gray !important;"> June 06 </td> <td style="text-align:left;color: gray !important;"> 11:45-13:00 </td> <td style="text-align:left;font-weight: bold;"> Vector Data </td> </tr> <tr> <td style="text-align:left;color: gray !important;color: gray !important;"> June 06 </td> <td style="text-align:left;color: gray !important;color: gray !important;"> 13:00-14:00 </td> <td style="text-align:left;font-weight: bold;color: gray !important;"> Fingerfood@GESIS </td> </tr> <tr> <td style="text-align:left;color: gray !important;background-color: yellow !important;"> June 06 </td> <td style="text-align:left;color: gray !important;background-color: yellow !important;"> 14:00-15:30 </td> <td style="text-align:left;font-weight: bold;background-color: yellow !important;"> Mapping </td> </tr> <tr> <td style="text-align:left;color: gray !important;border-bottom: 1px solid"> June 06 </td> <td style="text-align:left;color: gray !important;border-bottom: 1px solid"> 15:45-17:00 </td> <td style="text-align:left;font-weight: bold;border-bottom: 1px solid"> Raster Data </td> </tr> <tr> <td style="text-align:left;color: gray !important;"> June 07 </td> <td style="text-align:left;color: gray !important;"> 09:00-10:30 </td> <td style="text-align:left;font-weight: bold;"> Advanced Data Import & Processing </td> </tr> <tr> <td style="text-align:left;color: gray !important;"> June 07 </td> <td style="text-align:left;color: gray !important;"> 10:45-12:00 </td> <td style="text-align:left;font-weight: bold;"> Applied Data Wrangling & Linking </td> </tr> <tr> <td style="text-align:left;color: gray !important;color: gray !important;"> June 07 </td> <td style="text-align:left;color: gray !important;color: gray !important;"> 12:00-13:00 </td> <td style="text-align:left;font-weight: bold;color: gray !important;"> Lunch Break </td> </tr> <tr> <td style="text-align:left;color: gray !important;"> June 07 </td> <td style="text-align:left;color: gray !important;"> 13:00-14:30 </td> <td style="text-align:left;font-weight: bold;"> Investigating Spatial Autocorrelation </td> </tr> <tr> <td style="text-align:left;color: gray !important;"> June 07 </td> <td style="text-align:left;color: gray !important;"> 14:45-16:00 </td> <td style="text-align:left;font-weight: bold;"> Spatial Econometrics & Outlook </td> </tr> </tbody> </table> --- ## Fun With Flags... MAPS, It's Maps! .center[ <img src="data:image/png;base64,#../img/fun_with_flags.jpg" width="90%" style="display: block; margin: auto;" /> ] <br> .center[ <small><small><small> Fun with Flags by Dr. Sheldon Cooper. [Big Bang Theory](https://youtu.be/_e8PGPrPlwA)</small></small></small> ] --- ## Fun With Maps .pull-left[ `plot()` does not allow us to manipulate the maps in an easy. But we already have the two most essential ingredients to create a nice map: 1. Vector data stored in the `./data` folder 2. Some (hopefully) interesting attributes linked with the geometries. ] .pull-right[ <img src="data:image/png;base64,#1_3_Mapping_files/figure-html/corona-cologne-1.png" style="display: block; margin: auto;" /> ] --- ## Cologne Corona Data ```r corona_cologne <- sf::read_sf("./data/corona_cologne.shp") %>% dplyr::mutate( incidence_all_time = (anzhl_g / einwhnr) * 100 ) hospitals_cologne <- sf::read_sf("./data/hospitals_cologne.shp") streets_cologne <- sf::read_sf("./data/streets_cologne.shp") ``` --- ## What Makes a Good Map? <br> .pull-left[ **Good Mapping** - reduction to most important information - legends, scales, descriptions - audience oriented - adjusted for color vision deficiencies ] -- .pull-right[ **Bad Mapping** - overcrowding and overlapping - unreadable information - missing information like the legend or source - poor choice of color palettes ] --- ## What Makes a Good Map? .pull-left[ .center[] .tinyisher[.center[[Source](https://media.giphy.com/media/C9x8gX02SnMIoAClXa/giphy-downsized-large.gif)]] ] .pull-right[ ... but there is one other type: .center[ **The fast but nice map.** ] - fast exploration of spatial data by visualizing the geometries and attributes - might not be publication-ready yet, but they are more rewarding than just plotting information. ] --- ## The Choice Is Yours: `R` Packages for Mapping <br> <br> As always, `R` offers several ways to map spatial data, and the provided packages are various. What is out there? Just a few: - base R graphics package: [`mapdata`](https://rpubs.com/rbatzing/mapping) - mobile-friendly interactive maps: [`leaflet`](https://rstudio.github.io/leaflet/) - interactive and static thematic maps based on shapefiles: - [`tmap`](https://mran.microsoft.com/snapshot/2014-12-22/web/packages/tmap/vignettes/tmap-nutshell.html) - [`mapview`](https://r-spatial.github.io/mapview/) --- ## Our Choice Today Today, we'll concentrate on the package [`tmap`](https://cran.r-project.org/web/packages/tmap/index.html) - very intuitive and makes "good" decisions for us - the syntax is very similar to [`ggplot2`](https://cran.r-project.org/web/packages/ggplot2/index.html)* <img src="data:image/png;base64,#../img/68747470733a2f2f6d74656e6e656b65732e6769746875622e696f2f646f776e6c6f6164732f696d616765732f636c61737369632e706e67.png" width="50%" style="display: block; margin: auto;" /> .tinyisher[.center[[Source](https://camo.githubusercontent.com/63d5460e5fdfb78d42eedeaa54c14b63fcb7c872ac85e8c49fd1fd827553e9be/68747470733a2f2f6d74656e6e656b65732e6769746875622e696f2f646f776e6c6f6164732f696d616765732f636c61737369632e706e67)]] .footnote[*A wide-known 'secret' is that `tmap` creates a map based on `ggplot2`, so `ggplot2`-specific graphics manipulations will work as well.] --- ## First Map: Cologne Corona Data .pull-left[ ```r library(tmap) tm_shape(corona_cologne) + tm_fill("incidence_all_time") ``` ] -- .pull-right[ <img src="data:image/png;base64,#1_3_Mapping_files/figure-html/first-map-exec-1.png" style="display: block; margin: auto;" /> ] --- ## `tmap` In a Nutshell .pull-left[ There is not much to consider when using `tmap` but essential two requirements: 1. Define your spatial object. 2. Choose a building block to determine how to display information. ] -- .pull-right[ ```r # define and introduce every (new) # geospatial data object tm_shape() + # choose at least one building block as # 'aesthetic layer' # for polygon layer choose from: tm_fill() + # polygons without borders tm_polygons() + # polygons with borders tm_borders() + # only borders of polygons # for line layer choose: tm_lines() + # for point layer choose: tm_dots() + tm_bubbles() + # for raster layer choose tm_raster() + tm_rgb() + ... # for all of them: ?'tmap-element' ``` ] --- ## `tmap` In a Nutshell: Polygon Layer .pull-left[ ```r tm_shape(corona_cologne) + tm_fill() tm_shape(corona_cologne) + tm_polygons() tm_shape(corona_cologne) + tm_borders() ``` ] -- .pull-right[ <img src="data:image/png;base64,#1_3_Mapping_files/figure-html/pol-layer-1.png" style="display: block; margin: auto;" /><img src="data:image/png;base64,#1_3_Mapping_files/figure-html/pol-layer-2.png" style="display: block; margin: auto;" /><img src="data:image/png;base64,#1_3_Mapping_files/figure-html/pol-layer-3.png" style="display: block; margin: auto;" /> ] --- ## `tmap` In a Nutshell: Line and Point Layer .pull-left[ ```r tm_shape(streets_cologne) + tm_lines() tm_shape(hospitals_cologne) + tm_dots() ``` ] -- .pull-right[ <img src="data:image/png;base64,#1_3_Mapping_files/figure-html/line-layer-1.png" style="display: block; margin: auto;" /><img src="data:image/png;base64,#1_3_Mapping_files/figure-html/line-layer-2.png" style="display: block; margin: auto;" /> ] --- ## `tmap` In a Nutshell: Put It All Together We can map the geometric attributes as single layers, but we can also layer our map and stack the layers on each other. -- .pull-left[ ```r tm_shape(corona_cologne) + tm_polygons() + tm_shape(streets_cologne) + tm_lines() + tm_shape(hospitals_cologne) + tm_dots(col = "red") ``` ] -- .pull-right[ <img src="data:image/png;base64,#1_3_Mapping_files/figure-html/over-lay-1.png" style="display: block; margin: auto;" /> ] --- ## Add Some Information <br> <br> After we took care of our geometric types, we want to add some information to our data. The inner construction of each building block of `tm_elements` is the same. 1. Define the variable of interest first by stating the column name. 2. Add a name for legend title, color palette, adjust legend, scales ... --- ## Chosing an Attribute .pull-left[ ```r tm_shape(corona_cologne) + tm_polygons("incidence_all_time") ``` ] -- .pull-right[ .center[ <img src="data:image/png;base64,#1_3_Mapping_files/figure-html/life-exp-1.png" style="display: block; margin: auto;" /> ] ] --- ## Chosing a Color Palette .pull-left[ ```r tm_shape(corona_cologne) + tm_polygons( "incidence_all_time", palette = "RdPu", title = "Incidence", style = "kmeans" ) ``` ] -- .pull-right[ .center[ <img src="data:image/png;base64,#1_3_Mapping_files/figure-html/add-attributes-1.png" style="display: block; margin: auto;" /> ] ] --- ## Re-Placing the Legend .pull-left[ ```r tm_shape(corona_cologne) + tm_polygons( "incidence_all_time", palette = "RdPu", title = "Incidence", style = "kmeans" ) + tm_layout( legend.outside = TRUE ) ``` ] .pull-right[ .center[ <img src="data:image/png;base64,#1_3_Mapping_files/figure-html/add-attributes-legend-1.png" style="display: block; margin: auto;" /> ] ] --- class: middle ## Exercise 1_3_1: Basic Maps [Exercise](https://stefanjuenger.github.io/gesis-workshop-geospatial-techniques-R-2023/exercises/1_3_1_Basic_Maps.html) [Solution](https://stefanjuenger.github.io/gesis-workshop-geospatial-techniques-R-2023/solutions/1_3_1_Basic_Maps.html) --- ## What's Left? <br> .center[ <img src="data:image/png;base64,#../img/enough_maps.jpg" width="70%" style="display: block; margin: auto;" /> ] --- ## Compasses & Scale Bars .pull-left[ ```r tm_shape(corona_cologne) + tm_polygons("incidence_all_time") + tm_scale_bar() + tm_compass() ``` <img src="data:image/png;base64,#1_3_Mapping_files/figure-html/compass-scalebar-I-1.png" style="display: block; margin: auto;" /> ] -- .pull-right[ ```r tm_shape(corona_cologne) + tm_polygons("incidence_all_time") + tm_scale_bar(position = "left") + tm_compass(type = "4star") ``` <img src="data:image/png;base64,#1_3_Mapping_files/figure-html/compass-scalebar-II-1.png" style="display: block; margin: auto;" /> ] --- ## Getting Interactive (as an Alternative To `mapview::mapview()`)! .pull-left[ ```r tmap_mode("view") tm_shape(corona_cologne) + tm_borders(col = "red") ``` ] .pull-right[
] --- # Note On Mapping Responsible .pull-left[ **In the best cases**, maps are easy to understand and an excellent way to transport (scientific) messages. ] .pull-right[ **In the worst cases**, they simplify (spurious) correlations and draw a dramatic picture of the world. ] **Maps can shape narratives** - Decisions on which projection you use (remember the `true size` projector?), - the segment of the world you choose, - and the colors you add have a strong influence. Example: [Kenneth Field's blog post](https://www.esri.com/arcgis-blog/products/product/mapping/mapping-coronavirus-responsibly/) --- ## Color Vision Deficiencies: Standard Palette <img src="data:image/png;base64,#1_3_Mapping_files/figure-html/color-def-1.png" width="55%" style="display: block; margin: auto;" /> .tinyisher[Created with the package [`colorBlindness`](https://cran.r-project.org/web/packages/colorBlindness/index.html)] --- ## Color Vision Deficiencies: `Viridis` Palette <img src="data:image/png;base64,#1_3_Mapping_files/figure-html/color-def-virdis-1.png" width="55%" style="display: block; margin: auto;" /> .tinyisher[Created with the package [`colorBlindness`](https://cran.r-project.org/web/packages/colorBlindness/index.html)] --- ## More Resources <br> If you want to dive deeper into mapping with `tmap` check out: - Introduction by [Thomas Lo Russo](https://tlorusso.github.io/geodata_workshop/tmap_package) - Blogpost by [Hollie Zevross](http://zevross.com/blog/2018/10/02/creating-beautiful-demographic-maps-in-r-with-the-tidycensus-and-tmap-packages/) And if you want to get some inspiration, keep an eye out for the `#30DayMapChallenge` on Twitter. Repository of Last Year's Challenge [here](https://github.com/tjukanovt/30DayMapChallenge). --- class: middle ## Exercise 1_3_2: Fun with Maps [Exercise](https://stefanjuenger.github.io/gesis-workshop-geospatial-techniques-R-2023/exercises/1_3_2_Fun_with_Maps.html) [Solution](https://stefanjuenger.github.io/gesis-workshop-geospatial-techniques-R-2023/solutions/1_3_2_Fun_with_Maps.html) --- class: middle ## Add-on Slides: TMap Examples --- ## Map Examples: Covid-19 incidences and Hospital Beds Instead of placing maps next to each other, we can also explore spatial correlations by adding layers. Another benefit of layering: We can make our map more realistic and aesthetic. For example, we can add a background layer of neighboring countries, add a layer of German cities, or the German states' borders for orientation. Each layer can visualize another attribute of our map. For today, we want to add a layer of hospital point data to a Covid-19 incidence map. --- ## Covid-19 Incidences and Hospital Beds .pull-left[ ```r # map the hospitals on the covid-19 map hospital_covid_map <- tm_shape(german_districts_enhanced) + tm_polygons(col = "death_rate", title = "Death Rate", palette = "viridis", n = 10 ) + tm_layout(main.title = "Covid Death Rate in Germany", main.title.color = "black" ) + tm_legend(legend.outside = TRUE, legend.outside.position = "left") + # Add hospital data tm_shape(hospitals_sf) + tm_dots("beds", col = "lightgrey", alpha = 0.4, title.size = "Number of Hospital Beds") hospital_covid_map ``` ] .pull-right[ <img src="data:image/png;base64,#1_3_Mapping_files/figure-html/hospital-map-1.png" style="display: block; margin: auto;" /> ] --- ## German Federal Election 2021 <img src="data:image/png;base64,#1_3_Mapping_files/figure-html/btw-21_map-1.png" style="display: block; margin: auto;" /> --- ## The Corresponding Code .small[ Stroppe, A.-K., & Jungmann, N. (2022). Stadt, Land, Wahl: Welchen Einfluss hat der Wohnort auf die Wahlentscheidung bei der Bundestagswahl 2021? easy_social_sciences, 67, 49-60. https://doi.org/10.15464/easy.2022.07 ] ```r # With Credits to Nils Jungmann ## District Shapefile german_districts <- # load data sf::read_sf("./data/VG250_KRS.shp") %>% # transform to correct crs sf::st_transform(crs = 3035) %>% # subsetting land area of Germany dplyr::filter(GF == 4) %>% # only keep necessary cols dplyr::select(AGS,geometry) ## BL Shapefile german_states <- sf::read_sf("./data/VG250_LAN.shp") %>% # transform to correct crs sf::st_transform(crs = 3035) %>% # subsetting land area of Germany dplyr::filter(GF == 4) %>% # only keep necessary cols dplyr::select(AGS,geometry) ## German Federal Election Results 21 ### Abfrage bundeswahlleiter, 28.02.22 ### Wahlergebnisse nach kreisfreien Städten und Landkeisen ### https://www.bundeswahlleiter.de/bundestagswahlen/2021/ergebnisse/weitere-ergebnisse.html btw21_krs <- # load data read.csv2("./data/btw2021kreis_zweitstimme.csv", header= T, fill = T, sep= ";", dec = ",", colClasses=c("character","character",rep("numeric",44)), encoding = "UTF-8", strip.white = TRUE) %>% # correct name first col dplyr::rename(., AGS = 1) %>% # compute vote shares dplyr::mutate( AGS = stringr::str_pad(.$AGS, 5, pad = "0"), turnout = ((Ungültige + Gültige)/Wahlberechtigte) *100, union_shr = ((CDU + CSU) / Gültige) * 100, afd_shr = (AfD / Gültige) * 100, fdp_shr = (FDP / Gültige) * 100, spd_shr = (SPD / Gültige) * 100, linke_shr = (DIE.LINKE / Gültige) * 100, green_shr = (GRÜNE / Gültige) * 100, sonstige_shr = (rowSums(.[14:46])/Gültige) * 100) %>% # select necessary vars dplyr::select(AGS,turnout, ends_with(c("_shr"))) %>% # remove mean over all districts dplyr::filter(. , AGS != "00000") %>% # aggregate east and west berlin dplyr::mutate(. , AGS = ifelse(AGS == "11100" | AGS == "11200", "11000", AGS)) %>% dplyr::group_by(AGS) %>% dplyr::summarise(across(everything(), list(mean))) %>% dplyr::rename_with(~stringr::str_remove(., '_1')) ## correct for district that was reformed in 2022 btw21_krs <- btw21_krs %>% dplyr::filter(., AGS == "16063") %>% dplyr::mutate( AGS = "16056") %>% dplyr::bind_rows(btw21_krs,.) ## join election results to shapefile german_districts_btw <- german_districts %>% dplyr::left_join(. , btw21_krs, by = "AGS") # Prepare for mapping: Dataset for each party plus color union <- german_districts_btw %>% dplyr::select(union_shr, geometry) %>% dplyr::mutate(party = "Union", color = "#030303") %>% dplyr::rename(party_shr = union_shr) spd <- german_districts_btw %>% dplyr::select(spd_shr, geometry) %>% dplyr::mutate(party = "SPD", color = "#FF0000") %>% dplyr::rename(party_shr = spd_shr) fdp <- german_districts_btw %>% dplyr::select(fdp_shr, geometry) %>% dplyr::mutate(party = "FDP", color = "#FFFF00") %>% dplyr::rename(party_shr = fdp_shr) gruene <- german_districts_btw %>% dplyr::select(green_shr, geometry) %>% dplyr::mutate(party = "Gruene", color = "#66CD00") %>% dplyr::rename(party_shr = green_shr) linke <- german_districts_btw %>% dplyr::select(linke_shr, geometry) %>% dplyr::mutate(party = "Linke", color = "#8A2BE2") %>% dplyr::rename(party_shr =linke_shr) afd <- german_districts_btw %>% dplyr::select(afd_shr, geometry) %>% dplyr::mutate(party = "AfD", color = "#1E90FF") %>% dplyr::rename(party_shr = afd_shr) # bind the datasets party_shares <- rbind(union, spd, fdp, gruene, linke, afd) # plot ## nested dataset by_party <- party_shares %>% dplyr::group_by(party, color) %>% tidyr::nest() ## add list of party colors for figures party_colors <- c("#030303", "#FF0000", "#FFFF00", "#66CD00", "#8A2BE2", "#1E90FF") # custom party color palettes parties <- c("Union", "SPD", "FDP", "GRÜNE", "LINKE", "AfD") party_palette_fcts <- purrr::map(party_colors, ~ colorRampPalette(c("#FFFFFF",.x))) names(party_palette_fcts) <- paste0(parties,"_palette") union_palette <- party_palette_fcts[[1]](10) spd_palette <- party_palette_fcts[[2]](10) fdp_palette <- party_palette_fcts[[3]](10) gruene_palette <- party_palette_fcts[[4]](10) linke_palette <- party_palette_fcts[[5]](10) afd_palette <- party_palette_fcts[[6]](10) # labels for vote shares vs_labels <- c("0 bis 5", "5 bis 10", "10 bis 15", "15 bis 20", "20 bis 25", "25 bis 30", "30 bis 35", "35 bis 40", "40 bis 45", "45 bis 50") # maps # maps uni_btwshare_map <- tm_shape(subset(party_shares, party == "Union")) + tm_polygons("party_shr", title = "CDU/CSU", palette = union_palette, labels = vs_labels, style = "fixed", n = 10, breaks = c(0,5,10,15,20,25,30,35,40,45,50), border.alpha = 0) + tm_shape(german_states) + tm_polygons("AGS", alpha = 0, border.col = "lightgrey", legend.show = F) + tm_layout(legend.title.size = .8, legend.outside = T, frame = F) spd_btwshare_map <- tm_shape(subset(party_shares, party == "SPD")) + tm_polygons("party_shr", title = "SPD", palette = spd_palette, labels = vs_labels, style = "fixed", n = 10, breaks = c(0,5,10,15,20,25,30,35,40,45,50), border.alpha = 0) + tm_shape(german_states) + tm_polygons("AGS", alpha = 0, border.col = "lightgrey", legend.show = F) + tm_layout(legend.title.size = .8, legend.outside = T, frame = F) fdp_btwshare_map <- tm_shape(subset(party_shares, party == "FDP")) + tm_polygons("party_shr", title = "FDP", palette = fdp_palette, labels = vs_labels, style = "fixed", n = 10, breaks = c(0,5,10,15,20,25,30,35,40,45,50), border.alpha = 0) + tm_shape(german_states) + tm_polygons("AGS", alpha = 0, border.col = "lightgrey", legend.show = F) + tm_layout(legend.title.size = .8, legend.outside = T, frame = F) gru_btwshare_map <- tm_shape(subset(party_shares, party == "Gruene")) + tm_polygons("party_shr", title = "Grüne", palette = gruene_palette, labels = vs_labels, style = "fixed", n = 10, breaks = c(0,5,10,15,20,25,30,35,40,45,50), border.alpha = 0) + tm_shape(german_states) + tm_polygons("AGS", alpha = 0, border.col = "lightgrey", legend.show = F) + tm_layout(legend.title.size = .8, legend.outside = T, frame = F) lin_btwshare_map <- tm_shape(subset(party_shares, party == "Linke")) + tm_polygons("party_shr", title = "DIE LINKE", palette = linke_palette, labels = vs_labels, style = "fixed", n = 10, breaks = c(0,5,10,15,20,25,30,35,40,45,50), border.alpha = 0) + tm_shape(german_states) + tm_polygons("AGS", alpha = 0, border.col = "lightgrey", legend.show = F) + tm_layout(legend.title.size = .8, legend.outside = T, frame = F) afd_btwshare_map <- tm_shape(subset(party_shares, party == "AfD")) + tm_polygons("party_shr", title = "AfD", palette = afd_palette, labels = vs_labels, style = "fixed", n = 10, breaks = c(0,5,10,15,20,25,30,35,40,45,50), border.alpha = 0) + tm_shape(german_states) + tm_polygons("AGS", alpha = 0, border.col = "lightgrey", legend.show = F) + tm_layout(legend.title.size = .8, legend.outside = T, frame = F) # combine maps all_btwshare_map <- tmap_arrange(uni_btwshare_map, spd_btwshare_map, fdp_btwshare_map, gru_btwshare_map, lin_btwshare_map, afd_btwshare_map, ncol = 3) all_btwshare_map # tmap_save(all_btwshare_map, filename = "party_vote_shares_district_map.eps", dpi = 600) ``` --- layout: false class: center background-image: url(data:image/png;base64,#../assets/img/the_end.png) background-size: cover .left-column[ </br> <img src="data:image/png;base64,#../img/Anne.png" width="75%" style="display: block; margin: auto;" /> ] .right-column[ .left[.small[<svg viewBox="0 0 512 512" style="height:1em;position:relative;display:inline-block;top:.1em;" xmlns="http://www.w3.org/2000/svg"> <path d="M464 64H48C21.49 64 0 85.49 0 112v288c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V112c0-26.51-21.49-48-48-48zm0 48v40.805c-22.422 18.259-58.168 46.651-134.587 106.49-16.841 13.247-50.201 45.072-73.413 44.701-23.208.375-56.579-31.459-73.413-44.701C106.18 199.465 70.425 171.067 48 152.805V112h416zM48 400V214.398c22.914 18.251 55.409 43.862 104.938 82.646 21.857 17.205 60.134 55.186 103.062 54.955 42.717.231 80.509-37.199 103.053-54.947 49.528-38.783 82.032-64.401 104.947-82.653V400H48z"></path> </svg> [anne-kathrin.stroppe@gesis.org](mailto:anne-kathrin.stroppe@gesis.org)] .small[<svg viewBox="0 0 512 512" style="height:1em;position:relative;display:inline-block;top:.1em;" xmlns="http://www.w3.org/2000/svg"> <path d="M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z"></path> </svg> [`@astroppe`](https://twitter.com/stroppann)] .small[<svg viewBox="0 0 496 512" style="height:1em;position:relative;display:inline-block;top:.1em;" xmlns="http://www.w3.org/2000/svg"> <path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"></path> </svg> [`stroppann`](https://github.com/stroppann)] .small[<svg viewBox="0 0 576 512" style="height:1em;position:relative;display:inline-block;top:.1em;" xmlns="http://www.w3.org/2000/svg"> <path d="M280.37 148.26L96 300.11V464a16 16 0 0 0 16 16l112.06-.29a16 16 0 0 0 15.92-16V368a16 16 0 0 1 16-16h64a16 16 0 0 1 16 16v95.64a16 16 0 0 0 16 16.05L464 480a16 16 0 0 0 16-16V300L295.67 148.26a12.19 12.19 0 0 0-15.3 0zM571.6 251.47L488 182.56V44.05a12 12 0 0 0-12-12h-56a12 12 0 0 0-12 12v72.61L318.47 43a48 48 0 0 0-61 0L4.34 251.47a12 12 0 0 0-1.6 16.9l25.5 31A12 12 0 0 0 45.15 301l235.22-193.74a12.19 12.19 0 0 1 15.3 0L530.9 301a12 12 0 0 0 16.9-1.6l25.5-31a12 12 0 0 0-1.7-16.93z"></path> </svg> [`NA`](NA)]] ]